/*
 * PoolArchivosDemonio.java
 *
 * Created on 8 de noviembre de 2006, 03:56 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.gestion.carguegestion.demonio;
import com.src.computec.gestion.carguegestion.dto.ArchivoDto;
import com.src.computec.gestion.carguegestion.thread.ProcesarArchivo;
import com.src.computec.gestion.carguegestion.utilidades.ConstantesGenerales;
import java.io.File;
import java.util.Calendar;
import java.util.ArrayList;

/**
 *
 * @author jlperea
 */
public class PoolArchivosDemonio implements Runnable
{
    /** Creates a new instance of PoolArchivosDemonio */
    public PoolArchivosDemonio() 
    {
        System.out.println("PoolArchivosDemonio: PoolArchivosDemonio: ");        
    }
    
    public void run() 
    {
        while(true)
        {
            try
            {
                //if(ConstantesGenerales.ARCHIVOS_EN_PROCESO < ConstantesGenerales.NUM_MAX_THREADS)
                {                
                    ArrayList lista = this.getListaArchivos();

                    for(int i = 0; i < lista.size(); i++)
                    {
                        String[] datosArchivoArray = (String[])lista.get(i);
                        Long id = new Long(datosArchivoArray[0]);

                        ArchivoDto dto = (ArchivoDto)ConstantesGenerales.TABLA_ARCHIVOS.get(id);                
                        if(dto == null)
                        {
                            dto = new ArchivoDto();
                            dto.setId(id);
                            dto.setIdUser(datosArchivoArray[1]);
                            dto.setCodigoProveedor(datosArchivoArray[2]);

                            ConstantesGenerales.TABLA_ARCHIVOS.put(id,dto);
                        }
                        
                        //System.out.println("PoolArchivosDemonio: run: ARCHIVOS_EN_PROCESO: " + ConstantesGenerales.ARCHIVOS_EN_PROCESO);
                        //if(ConstantesGenerales.ARCHIVOS_EN_PROCESO < ConstantesGenerales.NUM_MAX_THREADS)
                        synchronized(this)
                        {                       
                            if(!dto.isEnCola())
                            {
                                System.out.println("PoolArchivosDemonio: run: id: " + id + ", IdUser: " + datosArchivoArray[1] + ", DTO: " + dto);
                                
                                ConstantesGenerales.ARCHIVOS_EN_PROCESO++;
                                dto.setEnCola(true);
                                dto.setCompletado(false);

                                /*ArchivosFileDAO dao = new ArchivosFileDAO();
                                dao.leerYescribirArchivoEnBD(id);   */                          
                                    
                                Thread t = new Thread( new ProcesarArchivo(id) );
                                t.start();    
                            }
                        }
                        /*else
                        {
                            break;
                        }*/
                    }
                    try 
                    {
                        comprobarBorradoTablaArchivos();
                        Thread.sleep(ConstantesGenerales.SLEEP_TIME);
                    } 
                    catch (InterruptedException ex) 
                    {
                        ex.printStackTrace();
                    }
                }
            }
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        } 
    }
    
    public void comprobarBorradoTablaArchivos()
    {
        Calendar calendar = Calendar.getInstance();
        
        if( calendar.get(Calendar.HOUR_OF_DAY) == 5 && calendar.get(Calendar.MINUTE) == 30 && 
            calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY && calendar.get(Calendar.SECOND) > 30 )
        {
            ConstantesGenerales.TABLA_ARCHIVOS.clear();
        }
    }
    
    public synchronized static ArrayList getListaArchivos()
    {
        ArrayList lista = new ArrayList();
        
        try
        {
            File directorio = new File(ConstantesGenerales.FOLDER_CARGUE_ARCHIVOS + ConstantesGenerales.PATH_ARCHIVOS);
            String[] archivos = directorio.list();
            
            for(int i = 0; i < archivos.length; i++)
            {
                String datosArchivo = archivos[i].substring( archivos[i].indexOf("_") + 1, archivos[i].lastIndexOf("."));
                
                String[] datosArchivoArray = datosArchivo.split(ConstantesGenerales.SPLIT_PARAM);
                Long id = new Long(datosArchivoArray[0]);
                
                ArchivoDto dto = (ArchivoDto)ConstantesGenerales.TABLA_ARCHIVOS.get(id);  
                
                if(dto == null || !dto.isEnCola())
                {
                    lista.add( datosArchivoArray );
                }
            }
        }
        catch(Exception e)
        {            
            System.out.println("ArchivosFileDAO: getListaArchivos: " + e);
            e.printStackTrace();
            return new ArrayList();
        }
        return lista;
    }
}
